import type { FieldOption, IBaseModel } from "../src";
import { useFieldDescriptor, useModelDescriptor, useModelOptions } from "../src";

/**
 * 定义一个带有自定义属性test的字段选项类型
 */
interface TestFieldOptions {
    test?: string
}

/**
 * 扩展FieldOption接口，定义一个带有自定义属性test2的字段选项类型
 */
type ElFieldOptions<T extends IBaseModel<T>> = FieldOption<T> & TestFieldOptions & {
    test2: number
}


const Field = useFieldDescriptor<BaseModel, ElFieldOptions<BaseModel>>()
const Model = useModelDescriptor<BaseModel>()

/**
 * 基础模型类，继承自EzBaseModel，泛型T约束为BaseModel的子类型或BaseModel<any>
 */
export class BaseModel<T extends BaseModel<T> = IBaseModel<any>> implements IBaseModel<T> {
    @Field('ID')
    // 标记当前字段为隐藏字段
    @Field.Hidden()
    id?: number

    @Field('创建时间')
    @Field.Hidden()
    createTime?: string
}

@Model("ModelTest")
export class ModelTest extends BaseModel<ModelTest> {
    // Field未指定泛型，自定义属性test无法推断typescript类型
    @Field('名称', { test: '123' })
    name?: string

    // Field指定泛型为BaseModel，可以推断出自定义属性test的类型为string
    @Field<BaseModel>('年龄', { test: 'sd11123', test2: 123, label: 'age', hidden: false, labelWidth: 120 })
    age?: number
}


@Model("ModelTest2")
export class ModelTest2 extends BaseModel<ModelTest2> {
    // Field未指定泛型，自定义属性test无法推断typescript类型
    @Field('名称', { test: '123' })
    name2?: string
    // Field未指定泛型，自定义属性test无法推断typescript类型
    @Field('日期')
    date?: string

    // Field指定泛型为BaseModel，可以推断出自定义属性test的类型为string
    @Field<BaseModel>('年龄', { test: 'sd11123', test2: 123, label: 'age', hidden: false, labelWidth: 120 })
    age2?: number
}



// 使用useModelOptions获取ModelTest的配置选项
// console.log('ModelTest: ', useModelOptions(ModelTest))
/**
 * 使用useModelOptions获取SysUser模型的jsonschema
 */

export function modelTest() {
    console.log('=== ModelTest 配置 ===')
    const jsonSchema1 = useModelOptions(ModelTest)
    console.log('ModelTest jsonSchema = ', jsonSchema1)

    console.log('\n=== ModelTest2 配置 ===')
    const jsonSchema2 = useModelOptions(ModelTest2)
    console.log('ModelTest2 jsonSchema = ', jsonSchema2)

    console.log('\n=== 验证两个类的配置是否独立 ===')
    console.log('ModelTest.name:', jsonSchema1.name)
    console.log('ModelTest2.name:', jsonSchema2.name)
    console.log('ModelTest.perms:', jsonSchema1.perms)
    console.log('ModelTest2.perms:', jsonSchema2.perms)
    console.log('ModelTest.api:', jsonSchema1.api)
    console.log('ModelTest2.api:', jsonSchema2.api)
}